package main

import "fmt"

// 切片
// 切片可以再切片
// 切片是引用类型

func main() {
	// 定义切片
	var s1 []int
	var s2 []string
	fmt.Println(s1, s2)
	fmt.Println(s1 == nil) // nil 空的意思，没有开辟内存空间
	fmt.Println(s2 == nil)
	// 切片初始化
	s1 = []int{1, 2, 3}
	s2 = []string{"北京", "上海", "深圳"}
	fmt.Println(s1, s2)
	fmt.Println(s1 == nil)
	fmt.Println(s2 == nil)

	// len()长度,cap()容量
	fmt.Printf("len(s1):%d cap(s1):%d\n", len(s1), cap(s1))
	fmt.Printf("len(s2):%d cap(s2):%d\n", len(s2), cap(s2))

	// 由数组得到切片,切片是动作，范围是左闭右开
	array1 := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	slice1 := array1[0:4]
	slice2 := array1[5:]
	fmt.Println(slice1)
	// 切片是动态向后扩容的
	// 切片的长度是切片元素的个数，切片的容量是切片在底层数组位置开始到最后一个元素的个数
	fmt.Printf("array1:%d len(array1):%d cap(array1):%d\n", array1, len(array1), cap(array1))
	fmt.Printf("slice1:%d len(slice1):%d cap(slice1):%d\n", slice1, len(slice1), cap(slice1))
	fmt.Printf("slice2:%d len(slice2):%d cap(slice2):%d\n", slice2, len(slice2), cap(slice2))

	// 切片再切片
	slice3 := slice1[0:2]
	fmt.Printf("slice3:%d len(slice3):%d cap(slice3):%d\n", slice3, len(slice3), cap(slice3))

	// 切片是引用类型,都指向了底层数组,底层改动，切片也被改动
	fmt.Println("array1:", array1)
	array1[0] = 99
	fmt.Println("slice1:", slice1)
	fmt.Println("array1:", array1)

}
